/****************************************************************************************
*            . .. .                                                                     *
*                    ...                                                                *
*                       .":                                                             *
*   .                      u                                                            *
* ..     .:uxkkOkkx=.      "k'                                                          *
*.     "k00O0ko==uk00x'     OO.                       IBE-CAE                           *
*'   .xK0O00: 'xx" x0Ku    .O0:     Copyright (C) by Internet Based Engineering         *
*   .O0OO00= oKOk:"O0O'    :00=                 All rights reserved.                    *
*.  =0OOO00" =OOO0Oo'     =0OO:                      www.ibe.cn                         *
*.  u0OOOO0O'          .o00OOO.                                                         *
* . :KOOOOO00xu=:::=uok00OOOO"                                                          *
*   .x00OOOOOO0000000OOOOOOx.                                                           *
*    .u00OOOOOOOOOOOOOOOOO=                                                             *
*      .ukOOOOOOOOOOOOku'                                                               *
*          .'::==::'.                                                                   *
****************************************************************************************/

#ifndef IBE_CASE_STEP_H_
#define IBE_CASE_STEP_H_

#include <string>
#include <vector>

#include "IBE_Object.h"

namespace ibe_common
{
    class IBE_FieldData;

    /**
    * @class IBE_CaseStep
    * @brief 时间步/增量步数据信息，存放场数据信息
    * @author liupeng
    */
    class IBE_COMMON_EXPORT IBE_CaseStep : public IBE_Object
    {
    public:
        explicit IBE_CaseStep();
        ~IBE_CaseStep();

        IBE_TypeMacro( ibe_common, IBE_CaseStep, ibe_common, IBE_Object );

        virtual void Initialize() override;
        /**
        * @brief 移除所有场数据内容（不delete内容）
        */
        virtual void ClearAllFieldDatas();
        /**
        * @brief 移除所有场数据内容（会delete内容）
        */
        virtual void DeleteAllFieldDatas();

        //@{
        /**
         * @brief 网格网格连接方式
         */
        enum IBE_MeshLinkMode
        {
            IBE_LINK_UNKNOWN = 0,       //!< 未知
            IBE_LINK_MESHS_ORIGINMESH   //!< Meshs/OriginMesh
        };
        /**
        * @brief 设置网格连接方式
        *
        * @param newMeshLinkMode IBE_CaseStep::IBE_MeshLinkMode枚举值
        */
        virtual void SetMeshLinkMode( const int newMeshLinkMode );
        virtual int GetMeshLinkMode()
        {
            return this->meshLinkMode_;
        }
        virtual std::string GetMeshLinkString();
        //@}

        //@{
        /**
        * @brief 设置/获取时间步名称
        *
        * @param name 时间步名称
        * @return 时间步名称
        */
        virtual void SetStepName( const char* name );
        virtual const char* GetStepName()
        {
            return this->stepName_.c_str();
        }
        //@}

        //@{
        /**
        * @brief 添加场数据信息
        *
        * @param fieldData 场数据
        */
        virtual void AddFieldData( IBE_FieldData* fieldData );
        /**
        * @brief 移除场数据信息（没有delete内容）
        *
        * @param fieldData 场数据
        * @param index 场数据索引
        */
        virtual void RemoveFieldData( IBE_FieldData* fieldData );
        virtual void RemoveFieldData( const int index );
        /**
        * @brief 移除场数据信息（会delete内容）
        *
        * @param fieldData 场数据
        */
        virtual void DeleteFieldData( IBE_FieldData* fieldData );
        virtual void DeleteFieldData( const int index );
        /**
        * @brief 获取场数据索引
        *
        * @param fieldData 场数据
        * @return 场数据索引
        */
        virtual int GetFieldDataIndex( IBE_FieldData* fieldData );
        /**
        * @brief 通过场数据索引，获取对应的场数据信息
        *
        * @param index 场数据索引
        * @return 场数据信息
        */
        virtual IBE_FieldData* GetFieldData( const int index );
        /**
        * @brief 通过场数据名称，获取对应的场数据信息
        *
        * @param fieldName 场数据名称
        * @return 场数据信息
        */
        virtual IBE_FieldData* GetFieldData( char* fieldName );
        /**
        * @brief 获取场数据个数
        *
        * @return 场数据个数
        */
        virtual int GetNumberOfFieldDatas();
        //@}

        virtual void Copy( ibe_common::IBE_Object* obj ) override;
        /**
        * @brief 复制基础信息，不复制IBE_FieldData信息
        *
        * @param obj 被复制的对象
        */
        virtual void CopyBase( ibe_common::IBE_Object* obj );
        /**
        * @brief 只复场数据信息
        *
        * @param obj 被复制的对象
        */
        virtual void CopyFieldDatas( ibe_common::IBE_Object* obj );

    protected:
        int meshLinkMode_; //!< 网格连接方式，默认为IBE_Enum::IBE_LINK_MESHS_ORIGINMESH
        std::string stepName_; //!< 时间步名称

        //! 存储所有场数据
        std::vector<IBE_FieldData*> fieldDatas_;

    private:
        IBE_CaseStep( const IBE_CaseStep& ) = delete;
        IBE_CaseStep& operator=( const IBE_CaseStep& ) = delete;
    };
} // namespace ibe_common

#endif // IBE_CASE_STEP_H_